﻿using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities;
using System.Xml.Linq;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.NeuChar.Context;
using Senparc.NeuChar.Entities;

namespace MyCode.Project.Services.CustomMessageHandler
{
    public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
    {
        public CustomMessageHandler(XDocument requestDoc, PostModel postModel = null, int maxRecordCount = 0)
                : base(requestDoc, postModel, maxRecordCount)
        {

        }

        public CustomMessageHandler(RequestMessageBase requestMessage, PostModel postModel = null, int maxRecordCount = 0)
            : base(requestMessage, postModel, maxRecordCount)
        {
        }

        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
            return responseMessage;
        }


        //    /// <summary>
        //    /// 处理文字请求
        //    /// </summary>
        //    /// <returns></returns>
        //    public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        //    {
        //        //说明：实际项目中这里的逻辑可以交给Service处理具体信息，参考OnLocationRequest方法或/Service/LocationSercice.cs
        //        var requestHandler = requestMessage.StartHandler();
        //        var defaultResponseMessage = base.CreateResponseMessage<ResponseMessageText>();
        //        // 获取主公众号关键词回复配置
        //        GetCurrentAutoreplyInfoResult AutoreplyInfoResult = GetCurrentAutoreplyInfo();
        //        KeywordAutoReplyInfo keywordAutoReplyInfo = null;
        //        // 关键词自动回复列表
        //        List<KeywordAutoReplyInfo_Item> keywordAutoReplyInfoItemlist = null;
        //        // 匹配的关键词列表
        //        List<KeywordListInfoItem> keywordListInfoList = null;
        //        // 回复内容列表
        //        List<ReplyListInfoItem> replyListInfoList = null;
        //        ReplyListInfoItem replyListInfo = null;
        //        // 关键词内容
        //        string content = null;
        //        // 回复匹配模式 contain 0：消息内容必须和关键词严格相同，equal 1：消息内容必须和关键词严格相同
        //        AutoReplyMatchMode matchMode;
        //        // 回复模式  reply_all 0：全部回复，random_one 1 回复其中任意一条
        //        AutoReplyMode autoReplyMode;
        //        // 回复类型 关键词的 貌似没用
        //        AutoReplyType keywordType;
        //        int randomone = 0;
        //        string[] keyWordArray;
        //        string wxUserName = requestMessage.ToUserName;

        //        //WechatAccountSettingEntity model = new WechatAccountSettingManager().GetObjectByUserName(wxUserName);
        //        //var accessToken = GlobalSetting.GetAuthorizerAccessToken(model);

        //        //int circleNum = 0;

        //        if (AutoreplyInfoResult == null)
        //        {
        //            //defaultResponseMessage.Content = "您刚才发送了文字信息：{0}\r\n\r\n", requestMessage.Content;
        //            //return defaultResponseMessage;
        //            requestHandler.Default(() =>
        //            {
        //                var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
        //                var result = new StringBuilder();
        //                result.AppendFormat("您刚才发送了文字信息：{0}\r\n\r\n", requestMessage.Content);
        //                result.AppendLine("\r\n");
        //                result.AppendLine("目前系统还没办法给你回复~~~");
        //                responseMessageText.Content = result.ToString();
        //                return responseMessageText;

        //            });
        //        }
        //        else
        //        {
        //            // 可以自定义系统的操作参数 而且可以指定必须是某个OpenId才可以
        //            if (string.Equals("刷新", requestMessage.Content))
        //            {
        //                requestHandler
        //                    //关键字不区分大小写，按照顺序匹配成功后将不再运行下面的逻辑
        //                    .Default(() =>
        //                    {
        //                            //AutoreplyInfoResult = GetCurrentAutoreplyInfo(true);
        //                            ////var result = new StringBuilder();
        //                            ////result.AppendLine("主公众号关键词配置已强制刷新完毕");
        //                            ////result.AppendLine("\r\n 数据内容");
        //                            ////result.AppendLine(AutoreplyInfoResult.FastToJson());
        //                            //defaultResponseMessage.Content = "主公众号关键词配置已强制刷新完毕";
        //                            try
        //                        {
        //                                //string authorizerAccessToken = GetAuthorizerAccessToken(model);

        //                                //CustomApi.SendText(accessToken, requestMessage.FromUserName, "现在时间是：" + DateTime.Now);
        //                                defaultResponseMessage.Content = "后台代码消息";
        //                        }
        //                        catch (Exception ex)
        //                        {

        //                            defaultResponseMessage.Content += ",出现异常：" + ex.Message;
        //                        }

        //                        return defaultResponseMessage;
        //                    });
        //            }
        //            else
        //            {
        //                keywordAutoReplyInfo = AutoreplyInfoResult.keyword_autoreply_info;
        //                if (keywordAutoReplyInfo == null)
        //                {
        //                    requestHandler.Default(() =>
        //                    {
        //                        var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
        //                        var result = new StringBuilder();
        //                        result.AppendFormat("您刚才发送了文字信息：{0}\r\n\r\n", requestMessage.Content);
        //                        result.AppendLine("\r\n");
        //                        result.AppendLine("没有获取到任何回复信息，貌似主系统没有配置或关闭了关键词回复功能");
        //                        responseMessageText.Content = result.ToString();
        //                        return responseMessageText;
        //                    });
        //                }
        //                else
        //                {
        //                    // 关键词回复信息列表
        //                    keywordAutoReplyInfoItemlist = keywordAutoReplyInfo.list;
        //                    if (keywordAutoReplyInfoItemlist != null && keywordAutoReplyInfoItemlist.Any())
        //                    {
        //                        // 判断输入的关键词是否在List中
        //                        foreach (var item in keywordAutoReplyInfoItemlist)
        //                        {
        //                            // 关键词列表 判断关键词是否符合输入的内容
        //                            keywordListInfoList = item.keyword_list_info;
        //                            autoReplyMode = item.reply_mode;
        //                            if (keywordListInfoList != null && keywordListInfoList.Any())
        //                            {
        //                                foreach (var keywordListInfoItem in keywordListInfoList)
        //                                {
        //                                    replyListInfoList = item.reply_list_info;
        //                                    content = keywordListInfoItem.content;
        //                                    // 是否精确匹配
        //                                    matchMode = keywordListInfoItem.match_mode;
        //                                    keywordType = keywordListInfoItem.type;
        //                                    if (!string.IsNullOrWhiteSpace(content))
        //                                    {
        //                                        // 只要包含了英文的,就是要进行分组
        //                                        if (content.IndexOf(",") > 0)
        //                                        {
        //                                            keyWordArray = content.Split(',');
        //                                        }
        //                                        else
        //                                        {
        //                                            keyWordArray = new string[] { content };
        //                                        }

        //                                        // 判断如果是随机回复一条 设置随机值
        //                                        if (autoReplyMode == AutoReplyMode.random_one)
        //                                        {
        //                                            Random rd = new Random();
        //                                            randomone = rd.Next(0, replyListInfoList.Count);
        //                                        }
        //                                        bool matchSuccessed = false;
        //                                        // 关键词列表 匹配
        //                                        foreach (var keyword in keyWordArray)
        //                                        {
        //                                            if (matchMode == AutoReplyMatchMode.equal)
        //                                            {
        //                                                // 精确匹配
        //                                                if (!requestHandler.MatchSuccessed &&
        //                                                    ((requestHandler.CaseSensitive && requestMessage.Content == keyword) ||
        //                                                    (!requestHandler.CaseSensitive && requestMessage.Content.ToUpper() == keyword.ToUpper())))
        //                                                {
        //                                                    matchSuccessed = true;
        //                                                    //requestHandler.ResponseMessage = func();
        //                                                    break;
        //                                                }
        //                                            }
        //                                            else
        //                                            {
        //                                                //// 只要包含就可以
        //                                                //if (!requestHandler.MatchSuccessed &&
        //                                                //    ((requestHandler.CaseSensitive && RequestMessageTextExtension.ContainEachOther(requestMessage.Content, keyword)) ||
        //                                                //    (!requestHandler.CaseSensitive && RequestMessageTextExtension.ContainEachOther(requestMessage.Content.ToUpper(), keyword.ToUpper()))))
        //                                                //{
        //                                                //    matchSuccessed = true;
        //                                                //    //requestHandler.ResponseMessage = func();
        //                                                //    break;
        //                                                //}
        //                                            }
        //                                        }
        //                                        if (matchSuccessed)
        //                                        {


        //                                            for (int i = 0; i < replyListInfoList.Count; i++)
        //                                            {
        //                                                // 使用自动回复
        //                                                if (matchMode == AutoReplyMatchMode.equal)
        //                                                {
        //                                                    replyListInfo = replyListInfoList[i];
        //                                                }
        //                                                else
        //                                                {
        //                                                    replyListInfo = replyListInfoList[0];
        //                                                }

        //                                                AutoReplyType replyType = replyListInfo.type;
        //                                                SetRequestHandler(requestMessage, requestHandler, defaultResponseMessage, replyListInfo, replyType);

        //                                                //if (matchMode == AutoReplyMatchMode.equal && i == randomone)
        //                                                //{
        //                                                //    continue;
        //                                                //}
        //                                                //else if (i == 0)
        //                                                //{
        //                                                //    continue;
        //                                                //}
        //                                                //else
        //                                                //{
        //                                                //    // 使用客服接口发送
        //                                                //    try
        //                                                //    {
        //                                                //        replyListInfo = replyListInfoList[i];
        //                                                //        //SendCustomMessagei(accessToken, requestMessage, replyListInfo);
        //                                                //    }
        //                                                //    catch (Exception ex)
        //                                                //    {
        //                                                //        //NLogHelper.Warn(ex, "关键词回复时，客户接口异常");
        //                                                //    }
        //                                                //}
        //                                            }

        //                                            // 匹配完毕不再执行
        //                                            break;
        //                                        }

        //                                        //// 回复内容列表
        //                                        //for (int i = 0; i < replyListInfoList.Count; i++)
        //                                        ////foreach (var replyListInfo in replyListInfoList)
        //                                        //{
        //                                        //    replyListInfo = replyListInfoList[i];
        //                                        //    // 是随机回复一条的模式
        //                                        //    if (autoReplyMode == AutoReplyMode.random_one)
        //                                        //    {
        //                                        //        // 此处思路不对，关键词是否符合是在HandlerRequest里判断的 需要移到外面判断？？
        //                                        //        if (randomone == i)
        //                                        //        {
        //                                        //HandlerRequest(requestHandler, requestMessage, defaultResponseMessage, replyListInfo, matchMode, keyWordArray);
        //                                        //            break;
        //                                        //        }
        //                                        //    }
        //                                        //    else
        //                                        //    {
        //                                        //        HandlerRequest(requestHandler, requestMessage, defaultResponseMessage, replyListInfo, matchMode, keyWordArray);

        //                                        //    }

        //                                        //    circleNum++;

        //                                        //    if (requestHandler.MatchSuccessed)
        //                                        //    {
        //                                        //        break;
        //                                        //    }
        //                                        //}
        //                                    }
        //                                }
        //                            }
        //                            // requestHandler.GetResponseMessage();
        //                            // 只要匹配成功就不再继续了
        //                            //if (requestHandler.MatchSuccessed)
        //                            //{
        //                            //    NLogHelper.Debug(requestMessage.Content + "匹配成功：autoReplyMode = " + AutoReplyMode.random_one + "，输出 ResponseMessage=" + requestHandler.GetResponseMessage().FastToJson());
        //                            //    break;
        //                            //}
        //                        }
        //                    }
        //                    else
        //                    {
        //                        var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
        //                        var result = new StringBuilder();
        //                        result.AppendFormat("您刚才发送了文字信息：{0}\r\n\r\n", requestMessage.Content);
        //                        result.AppendLine("\r\n");
        //                        result.AppendLine("没有获取到关键词回复列表数据");
        //                        responseMessageText.Content = result.ToString();
        //                        return responseMessageText;
        //                    }
        //                }
        //            }
        //        }

        //        if (!requestHandler.MatchSuccessed)
        //        {
        //            requestHandler.Default(() =>
        //            {
        //                var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
        //                var result = new StringBuilder();
        //                result.AppendFormat("您刚才发送了信息：{0}\r\n\r\n", requestMessage.Content);
        //                result.AppendLine("\r\n");
        //                result.AppendLine("目前还不能理解您的意思。");
        //                responseMessageText.Content = result.ToString();
        //                return responseMessageText;
        //            });
        //        }

        //        return requestHandler.GetResponseMessage() as IResponseMessageBase;
        //    }

        //    /// <summary>
        //    /// 关键词自动回复
        //    /// </summary>
        //    /// <param name="requestMessage"></param>
        //    /// <param name="requestHandler"></param>
        //    /// <param name="defaultResponseMessage"></param>
        //    /// <param name="replyListInfo"></param>
        //    /// <param name="replyType"></param>
        //    private void SetRequestHandler(RequestMessageText requestMessage, RequestMessageTextKeywordHandler requestHandler, ResponseMessageText defaultResponseMessage, ReplyListInfoItem replyListInfo, AutoReplyType replyType)
        //    {
        //        LogHelper.Info("replyType" + replyType.ToString());
        //        switch (replyType)
        //        {
        //            case AutoReplyType.text:
        //                var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
        //                responseMessageText.Content = replyListInfo.content;
        //                requestHandler.ResponseMessage = responseMessageText;
        //                break;
        //            case AutoReplyType.img:
        //                var responseMessageImage = base.CreateResponseMessage<ResponseMessageImage>();
        //                responseMessageImage.Image.MediaId = replyListInfo.content;
        //                requestHandler.ResponseMessage = responseMessageImage;
        //                break;
        //            case AutoReplyType.voice:
        //                var responseMessageVoice = base.CreateResponseMessage<ResponseMessageVoice>();
        //                responseMessageVoice.Voice.MediaId = replyListInfo.content;
        //                requestHandler.ResponseMessage = responseMessageVoice;
        //                break;
        //            case AutoReplyType.video:
        //                var responseMessageVideo = base.CreateResponseMessage<ResponseMessageVideo>();
        //                responseMessageVideo.Video.MediaId = replyListInfo.content;
        //                requestHandler.ResponseMessage = responseMessageVideo;
        //                break;
        //            case AutoReplyType.news:
        //                var responseMessageNews = base.CreateResponseMessage<ResponseMessageNews>();
        //                //responseMessageNews.Articles = replyListInfo.news_info.list; 
        //                //return responseMessageNews;
        //                foreach (var newsInfo in replyListInfo.news_info.list)
        //                {
        //                    responseMessageNews.Articles.Add(new Article()
        //                    {
        //                        Title = newsInfo.title,
        //                        Description = newsInfo.digest,
        //                        Url = newsInfo.content_url,
        //                        PicUrl = newsInfo.cover_url
        //                    });
        //                }
        //                requestHandler.ResponseMessage = responseMessageNews;
        //                break;
        //            default:
        //                var result = new StringBuilder();
        //                result.AppendFormat("您刚才发送了文字信息：{0}\r\n\r\n", requestMessage.Content);
        //                result.AppendLine("\r\n");
        //                result.AppendFormat("由于没有这个类型：{0}，系统不能给你任何回复", replyListInfo.type);
        //                defaultResponseMessage.Content = result.ToString();
        //                requestHandler.ResponseMessage = defaultResponseMessage;
        //                break;
        //        }
        //        // 设置匹配成功
        //        requestHandler.MatchSuccessed = true;
        //    }

        //    /// <summary>
        //    /// 推送客服消息
        //    /// </summary>
        //    /// <param name="accessToken"></param>
        //    /// <param name="requestMessage"></param>
        //    /// <param name="replyListInfo"></param>
        //    /// <param name="replyType"></param>
        //    private void SendCustomMessagei(string accessToken, RequestMessageText requestMessage, ReplyListInfoItem replyListInfo)
        //    {
        //        AutoReplyType replyType = replyListInfo.type;
        //        switch (replyType)
        //        {
        //            case AutoReplyType.text:
        //                CustomApi.SendText(accessToken, requestMessage.FromUserName, replyListInfo.content);
        //                break;
        //            case AutoReplyType.img:
        //                CustomApi.SendImage(accessToken, requestMessage.FromUserName, replyListInfo.content);
        //                break;
        //            case AutoReplyType.voice:
        //                CustomApi.SendVoice(accessToken, requestMessage.FromUserName, replyListInfo.content);
        //                break;
        //            case AutoReplyType.video:
        //                CustomApi.SendVideo(accessToken, requestMessage.FromUserName, replyListInfo.content, "视频回复", "视频消息");
        //                break;
        //            case AutoReplyType.news:
        //                List<Article> articles = new List<Article>();
        //                foreach (var newsInfo in replyListInfo.news_info.list)
        //                {
        //                    articles.Add(new Article()
        //                    {
        //                        Title = newsInfo.title,
        //                        Description = newsInfo.digest,
        //                        Url = newsInfo.content_url
        //                    });
        //                }
        //                CustomApi.SendNews(accessToken, requestMessage.FromUserName, articles);
        //                break;
        //        }
        //    }

        //    /// <summary>
        //    /// 获取主公众号自动回复规则设置
        //    /// </summary>
        //    /// <returns></returns>
        //    protected GetCurrentAutoreplyInfoResult GetCurrentAutoreplyInfo()
        //    {

        //        // 进行缓存
        //        GetCurrentAutoreplyInfoResult infoResult = null;
        //        try
        //        {
        //            IContainerCacheStrategy containerCache = LocalContainerCacheStrategy.Instance;
        //            IBaseObjectCacheStrategy baseCache = containerCache.BaseCacheStrategy();
        //            string key = "AutoreplyInfo:" + appId;
        //            HashSetCacheModel<GetCurrentAutoreplyInfoResult> cacheModel = null;
        //            if (baseCache.CheckExisted(key))
        //            {
        //                cacheModel = baseCache.Get<HashSetCacheModel<GetCurrentAutoreplyInfoResult>>(key);
        //                if (cacheModel.ExpireAt < DateTime.Now)
        //                {
        //                    // 过期了，要更新一次
        //                    infoResult = AutoReplyApi.GetCurrentAutoreplyInfo(appId);
        //                    cacheModel = new HashSetCacheModel<GetCurrentAutoreplyInfoResult>();
        //                    cacheModel.CreateOn = DateTime.Now;
        //                    cacheModel.ExpireAt = DateTime.Now.AddMinutes(10);
        //                    cacheModel.Value = infoResult;
        //                    baseCache.Update(key, cacheModel);
        //                }
        //                infoResult = cacheModel.Value;
        //            }
        //            else
        //            {
        //                infoResult = AutoReplyApi.GetCurrentAutoreplyInfo(appId);
        //                cacheModel = new HashSetCacheModel<GetCurrentAutoreplyInfoResult>();
        //                cacheModel.CreateOn = DateTime.Now;
        //                cacheModel.ExpireAt = DateTime.Now.AddMinutes(10);
        //                cacheModel.Value = infoResult;
        //                baseCache.Set(key, cacheModel);
        //            }
        //        }
        //        catch (Exception ex)
        //        {
        //            LogHelper.Error("GetCurrentAutoreplyInfo", ex);
        //        }

        //        return infoResult;
        //    }
        //}

        ///// <summary>
        ///// HashSetCacheModel<T>
        ///// HashSet结构
        ///// 
        ///// 修改纪录
        ///// 
        ///// 2018-07-02版本：1.0 JiShiYu 创建文件。     
        ///// 
        ///// <author>
        /////     <name>JiShiYu</name>
        /////     <date>2018-07-02</date>
        ///// </author>
        ///// </summary>
        //public class HashSetCacheModel<T>
        //{
        //    /// <summary>
        //    /// 进入缓存的时间
        //    /// </summary>
        //    public DateTime CreateOn { set; get; } = DateTime.Now;

        //    /// <summary>
        //    /// 缓存过期时间
        //    /// </summary>
        //    public DateTime ExpireAt { set; get; }

        //    /// <summary>
        //    /// 缓存对象的值
        //    /// </summary>
        //    public T Value { get; set; }
        //}

    }
}
